/* 
 * File:   Data.h
 * Author: song
 *
 * Created on 2010年10月28日, 下午1:11
 */

#ifndef _DATA_H
#define	_DATA_H

#include<stdio.h>
#include<iostream>
#include<fstream>
#include <queue>
#include <vector>
using namespace std;
#include <cv.h>
#include"highgui.h"
#include"cxcore.h"
#include "cvaux.h"
#include<omp.h>

#define NUMSPEEDFRAME 4

//通过 c++ wrapper 的图像像素的直接访问
template<class T> class Image
{
  private:
  IplImage* imgp;
  public:
  Image(IplImage* img=0) {imgp=img;}
  ~Image(){imgp=0;}
  void operator=(IplImage* img) {imgp=img;}
  inline T* operator[](const int rowIndx) {
    return ((T *)(imgp->imageData + rowIndx*imgp->widthStep));}
};

typedef struct{
  unsigned char b,g,r;
} RgbPixel;

typedef struct{
  float b,g,r;
} RgbPixelFloat;

typedef Image<RgbPixel>       RgbImage;
typedef Image<RgbPixelFloat>  RgbImageFloat;
typedef Image<unsigned char>  BwImage;
typedef Image<float>          BwImageFloat;

typedef struct trackObject
{
    int id, lostfrm;
    int showID;
    bool matched, deleted;
    //认为物体稳定的大小
    int weigh, heigh;
    //前景图获取的最大图像的中心点坐标，如果没有匹配的loacateSize则为-1
    int locateX, locateY, locateSize;
    CvPoint pt0, pt1;
    CvRect rect;
    CvConnectedComp comp;
    CvBox2D box;
    IplImage *image, *mask, *hsv, *hue, *backProject;
    //直方图
    CvHistogram *hist;
}
trackObject;

typedef struct Camera
{
    //直方图
    CvHistogram *hist;

    //帧图像 前景和后景 当前帧灰度化图像 以及对应矩阵
    IplImage *pFrame, *pPre, *pFrImg, *pBkImg, *pGray, *tmpBk;
    CvMat* pFrameMat, *pFrMat, *pBkMat, *pGrayMat, *tmpBkMat;

    //从摄像头中读取图像的捕捉器
    CvCapture *capture;
};

//计算模块中使用的数据结构
struct parmNode
{
    //在新物体的匹配过程中时，作为是否匹配字段，在追踪过程中认为是否存活字段
    bool match;
    int dx;
    //当前各个分量速度
    float xSpeed, ySpeed, zSpeed;
    //视深距离
    int zDis, xDis, yDis;
    //该物体对应的左右两个摄像头中物体ID
    int lID, rID;
    //该物体对应左右两个数组中的下标
    int lIndex, rIndex;
    //上一帧中的位置
    float preX[NUMSPEEDFRAME], preY[NUMSPEEDFRAME], preZ[NUMSPEEDFRAME];
    //修正后的数据
    float fixX[NUMSPEEDFRAME], fixY[NUMSPEEDFRAME], fixZ[NUMSPEEDFRAME];
    
    //历史速度
    float Vx[100], Vy[100], Vz[100];
    int Vnum;
    //几帧之间的间隔时间
    clock_t time[NUMSPEEDFRAME];
    //是否为被跟踪中的
    bool tracked;

    int num;
};

struct speedNode
{
    int id;
    float Vx, Vy, Vz, zDis;
};

struct calNode
{
    trackObject *L, *R;
    trackObject objsL[20], objsR[20];
    int lIndex[20], rIndex[20];
    int lLen, rLen;
    struct parmNode objCal[20];
};

#endif	/* _DATA_H */

